package MyPriorityQueue;

import java.util.*;

/***
 * 1296. 划分数组为连续数字的集合
 *
 * 给你一个整数数组 nums 和一个正整数 k，请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。
 * 如果可以，请返回 True；否则，返回 False。
 *
 * 注意：此题目与 846 重复：https://leetcode-cn.com/problems/hand-of-straights/
 */
public class Leetcode1296 {
    public static boolean isPossibleDivide(int[] nums, int k) {
        int len = nums.length;
        if (len % k != 0) {
            return false;
        }
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(len);

        for (int num : nums) {
            minHeap.add(num);
        }

        while (!minHeap.isEmpty()) {
            int top = minHeap.poll();
            for (int i = 1; i <= k - 1; i++) {
                if (!minHeap.remove(top + i)){
                    return false;
                }
            }

        }
        return true;
    }

    public static boolean isPossibleDivide2(int[] nums, int k) {
        int len = nums.length;
        if (len % k != 0) {
            return false;
        }
        Arrays.sort(nums);
        Map<Integer, Integer> mp = new HashMap<>();
        for(int num:nums){
            int count = mp.getOrDefault(num, 0);
            mp.put(num, count+1);
        }
//        System.out.println(mp.toString());

        for(int i=0; i<len; i++){
            if(!mp.containsKey(nums[i]) || mp.get(nums[i]) == 0){
                continue;
            }
            for(int j=nums[i]; j<=nums[i]+k-1; j++){
                if(!mp.containsKey(j) || mp.get(j) == 0){
                    return false;
                }else {
                    int current = mp.get(j);
                    mp.put(j, current-1);
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{1, 4, 2, 3, 3, 4,2,1};
        System.out.println(isPossibleDivide2(arr, 4));

    }
}
